(* 3911696 *)
MODULE P2RedSocial;

FROM WholeStr		IMPORT StrToCard, ConvResults, CardToStr;
FROM Strings		IMPORT Equal, Assign, Length, Extract, FindNext;
FROM Archivo		IMPORT Load, Save, NombreArchivo;
FROM Condicion		IMPORT Condicion;(*, CrearVaciaCondicion, CondPor, CondOperador, CondValor,
				CrearCondicion;*)
				
FROM Mensaje		IMPORT AsuntoMensaje, CuerpoMensaje, FechaMensaje;
FROM DicUsuario		IMPORT DicUsuario, CrearDicUsuario, PerteneceUsrDicUsuario, ObtenerUsrDicUsuario,
				DestruirDicUsuario, ObtenerCantUsrDicUsuario;
FROM Usuario		IMPORT Usuario, ObtenerCorreoUsuario;

FROM ImpresionResultado	IMPORT CodigoImpresionResultado, ImpresionResultado, CrearImpresionResultado,
				AsignarCodigoImpresionResultado, AsignarParamImpresionResultado, ImprimirImpresionResultado,
				DestruirImpresionResultado;
				
FROM Comando		IMPORT Comando, NombreComando, LeerComando, ParametroACondicion,
				ObtenerNombreComando, ObtenerCantParamComando,
				ObtenerParamComando, DestruirComando, MAXLARGOPARAM, CondicionAParametro;
				
FROM LstOrdenMensajes	IMPORT LstOrdenMensajes, CrearLstOrdenMensajes, InsertarLstOrdenMensajes,
				DestruirLstOrdenMensajes;
FROM OrdenMensajes	IMPORT OrdenarPor, OrdenForma, CrearOrdenMensajes, OrdenMensajes;
				
FROM InOut 		IMPORT WriteLn, WriteString;
FROM LstCorreo		IMPORT Correo;
FROM Comentario		IMPORT TextoComentario;
FROM ManejadorRedSocial	IMPORT AgregarUsuario, ModificarDatosUsuario, ListarUsuarios, BorrarUsuario,
				EnviarMensaje, ListarMensajes, SolicitudAmigo, AceptarSolicitudAmigo,
				RechazarSolicitudAmigo, BorrarAmigo, BorrarMensajes, LeerMensaje,
				BuscarAmigos, SugerirAmigos, EscribirEnMuro, ListarMuro, PasarAlHistorial,
				RecuperarDelHistorial, ListarHistorial, ListarPrivacidad, ModificarPrivacidad,
				ListarAmigos, GradoSeparacion, ListarBarrio;


PROCEDURE SacarComillas (origen : ARRAY OF CHAR; VAR destino :  ARRAY OF CHAR);
BEGIN
	Extract(origen, 1, (Length(origen) - 2), destino);
END SacarComillas;
				
PROCEDURE ObtenerPor(StrPor : ARRAY OF CHAR) : OrdenarPor;
BEGIN
	IF Equal(StrPor, 'FECHA') THEN
		RETURN ORDEN_FECHA;
	END;
	IF Equal(StrPor, 'DE') THEN
		RETURN ORDEN_DE;
	END;
	IF Equal(StrPor, 'ASUNTO') THEN
		RETURN ORDEN_ASUNTO;
	END;
END ObtenerPor;

PROCEDURE ObtenerOrden(StrOrden : ARRAY OF CHAR) : OrdenForma;
BEGIN
	IF Equal(StrOrden, 'ASC') THEN
		RETURN ASC;
	ELSE
		RETURN DSC;
	END;
END ObtenerOrden;


PROCEDURE CrearLstOrdenString(StrPor, StrOrden : ARRAY OF CHAR) : LstOrdenMensajes;
VAR
	ordenPor : OrdenarPor;
	ordenForma : OrdenForma;
	patternFound : BOOLEAN;
	pos1Por : CARDINAL;
	pos1Orden : CARDINAL;
	posOfPatternPor : CARDINAL;
	posOfPatternOrden : CARDINAL;
	StrPorAux : ARRAY [0..12] OF CHAR;
	StrOrdenAux : ARRAY [0..3] OF CHAR;
	l : LstOrdenMensajes;
	om : OrdenMensajes;		
BEGIN
	pos1Por := 0;
	pos1Orden := 0;
	l := CrearLstOrdenMensajes();
	
	(********* Busco ':' en el string 'Por' ***********************)
	FindNext(':', StrPor, pos1Por, patternFound, posOfPatternPor);
	
	WHILE patternFound DO
		
	(********* Tomo el string 'Por' ********************************)
		Extract(StrPor, pos1Por, posOfPatternPor - pos1Por, StrPorAux);
				
	(********* Busco ':' en string de 'Orden' **********************)
		FindNext(':', StrOrden, pos1Orden, patternFound, posOfPatternOrden);
	(********* Tomo el string 'Orden' ********************************)	
		Extract(StrOrden, pos1Orden, posOfPatternOrden - pos1Orden, StrOrdenAux);
		
		ordenPor := ObtenerPor(StrPorAux);
		ordenForma := ObtenerOrden(StrOrdenAux);
		om := CrearOrdenMensajes(ordenPor, ordenForma);
		InsertarLstOrdenMensajes(om, l);			
		       		
	(********* Busco el prox ':' en string de 'Por' ***********************)
		pos1Por := posOfPatternPor + 1;
		pos1Orden := posOfPatternOrden + 1;
		FindNext(':', StrPor, pos1Por, patternFound, posOfPatternPor);
	END;
	
	(************ Tomo el ultimo valor y ultimo campo *******)
	Extract(StrPor, pos1Por, Length(StrPor) - pos1Por, StrPorAux);
	Extract(StrOrden, pos1Orden, Length(StrOrden) - pos1Orden, StrOrdenAux);
	
	ordenPor := ObtenerPor(StrPorAux);
	ordenForma := ObtenerOrden(StrOrdenAux);
	InsertarLstOrdenMensajes(CrearOrdenMensajes(ordenPor, ordenForma), l);		
	
	RETURN l;
END CrearLstOrdenString;

(*PROCEDURE CrearCondConString(StrCond1, StrCond2, StrCond3 : ARRAY OF CHAR) : Condicion;
VAR
	NuevaCond : Condicion;
	por : CondPor;
	op : CondOperador;
	valor : CondValor;
BEGIN
	IF Equal('""', StrCond1) THEN
		NuevaCond := CrearVaciaCondicion();
	ELSE
	        IF Equal(StrCond1, "USR_POR_CORREO") THEN
			por := COND_USR_POR_CORREO;	
		END;
		IF Equal(StrCond1, "USR_POR_NOMBRE") THEN
			por := COND_USR_POR_NOMBRE;
		END;
		IF Equal(StrCond1, "USR_POR_APELLIDO") THEN
			por := COND_USR_POR_APELLIDO;
		END;
		IF Equal(StrCond1, "USR_POR_TELEFONO") THEN
			por := COND_USR_POR_TELEFONO;
		END;
		IF Equal(StrCond1, "USR_POR_SEXO") THEN
			por := COND_USR_POR_SEXO;
		END;
		IF Equal(StrCond1, "USR_POR_EDAD") THEN
			por := COND_USR_POR_EDAD;
		END;
		IF Equal(StrCond1, "MSJ_FECHA") THEN
			por := COND_MSJ_FECHA;
		END;
		IF Equal(StrCond1, "MSJ_DE") THEN
			por := COND_MSJ_DE;
		END;
		IF Equal(StrCond1, "MSJ_ASUNTO") THEN
			por := COND_MSJ_ASUNTO;
		END;
		IF Equal(StrCond1, "MSJ_TIPO_MENSAJE") THEN
			por := COND_MSJ_TIPO_MENSAJE;
		END;
		IF Equal(StrCond1, "MSJ_SOLICITUD_ESTADO") THEN
			por := COND_MSJ_SOLICITUD_ESTADO;
		END;
		IF Equal(StrCond1, "MSJ_NOTIFICACION_TIPO") THEN
			por := COND_MSJ_NOTIFICACION_TIPO;
		END;
		
		IF Equal(StrCond2, "=") THEN
		        op := OP_IGUAL;
		ELSE
			IF Equal(StrCond2, ">") THEN
				op := OP_MAYOR;
			ELSE
				op := OP_MENOR;
			END;
		END;
		Extract(StrCond3, 1, (Length(StrCond3) - 2), valor);
		NuevaCond := CrearCondicion(por, op, valor);
	END;
	RETURN NuevaCond;
END CrearCondConString;*)
(*************************************************)
(************** PROGRAMA PRINCIPAL ***************)
(*************************************************)
VAR
        FinPrograma : BOOLEAN;
	c, correoDestino : Correo;
	asunto : AsuntoMensaje;
	cuerpo : CuerpoMensaje;
	fecha : FechaMensaje;
	LstOrd : LstOrdenMensajes;
	res : ConvResults;
	
	strCant : ARRAY [0..10] OF CHAR;
	usrConectado : Usuario;
	ir, irPrompt : ImpresionResultado;
	cmd : Comando;
	cmdName : NombreComando;
	cantParam : CARDINAL;
	AdminUsr : BOOLEAN;
	usuarios : DicUsuario;
	cond : Condicion;
	comentario : ARRAY [0..MAXLARGOPARAM] OF CHAR;
	comentarioMuro : TextoComentario;
	paramImpr : ARRAY [0..MAXLARGOPARAM] OF CHAR;
	cantidad : CARDINAL;
	fileName : NombreArchivo;
BEGIN
	AdminUsr := TRUE;
	usuarios := CrearDicUsuario();
	FinPrograma := FALSE;
	
(***************** Imprimo la Bienvenida ****************)
        ir := CrearImpresionResultado();
	irPrompt := CrearImpresionResultado();
	AsignarCodigoImpresionResultado(BIENVENIDA , ir);
	ImprimirImpresionResultado(ir);
	AsignarCodigoImpresionResultado(VACIO, ir);
		
	
(***************** Imprimo el Prompt ****************)	
	AsignarCodigoImpresionResultado(PROMPT , irPrompt);
		
	WHILE (NOT FinPrograma) DO
		
		(***************** Imprimo el Prompt ****************)
		ImprimirImpresionResultado(irPrompt);
		cmd := LeerComando();
		cmdName := ObtenerNombreComando(cmd);	
	
		cantParam := ObtenerCantParamComando(cmd);
		
		IF Equal(cmdName, "#") THEN
			Assign(ObtenerParamComando(1, cmd), comentario);
			Extract(comentario, 1, Length(comentario) - 2, comentario);
			
			WriteString("# ");
			WriteString(comentario);
			WriteLn();
			AsignarCodigoImpresionResultado(VACIO, ir);
		END;
(***************** LOGIN *************************)
		IF Equal(cmdName, "login") THEN
			IF AdminUsr THEN
				Assign(ObtenerParamComando(1, cmd), c);
				IF PerteneceUsrDicUsuario(c, usuarios) THEN
					AdminUsr := FALSE;
					usrConectado := ObtenerUsrDicUsuario(c, usuarios);
					c := ObtenerCorreoUsuario(usrConectado);
					AsignarCodigoImpresionResultado(LOGIN, ir);
					AsignarParamImpresionResultado(1, c, ir);	
				ELSE
				        AsignarCodigoImpresionResultado(USUARIO_INEXISTENTE, ir);
					AsignarParamImpresionResultado(1, c, ir);
				END;	
			ELSE
				AsignarCodigoImpresionResultado(USUARIO_LOGUEADO, ir);
			END;
		END;
(***************** LOGOUT *************************)
		IF Equal(cmdName, "logout") THEN
			IF AdminUsr THEN
				AsignarCodigoImpresionResultado(USUARIO_NOLOGUEADO, ir);
			ELSE
				c := ObtenerCorreoUsuario(usrConectado);
				AsignarCodigoImpresionResultado(LOGOUT, ir);
				AsignarParamImpresionResultado(1, c, ir);
				AdminUsr := TRUE;	
			END;
		END;

(***************** AGREGAR USUARIO *************************)
		IF Equal(cmdName, "agregarUsuario") THEN
			IF AdminUsr THEN
				AgregarUsuario (ObtenerParamComando(1, cmd), ObtenerParamComando(2, cmd),
						ObtenerParamComando(3, cmd), ObtenerParamComando(4, cmd),
						ObtenerParamComando(5, cmd), ObtenerParamComando(6, cmd),
						usuarios, ir);
			ELSE
				AsignarCodigoImpresionResultado(OPERACION_PRIVILEGIADA, ir);
				AsignarParamImpresionResultado(1, cmdName, ir);	
			END;
		END;

(***************** BORRAR USUARIO *************************)
		IF Equal(cmdName, "borrarUsuario") THEN
			IF AdminUsr THEN
				Assign(ObtenerParamComando(1, cmd), c);
				BorrarUsuario(c, usuarios, ir);
			ELSE
				AsignarCodigoImpresionResultado(OPERACION_PRIVILEGIADA, ir);
				AsignarParamImpresionResultado(1, cmdName, ir);	
			END;	
		END;

(***************** MODIFICAR USUARIO *************************)
		IF Equal(cmdName, "modificarDatosUsuario") THEN
			IF AdminUsr THEN
				AsignarCodigoImpresionResultado(USUARIO_NOLOGUEADO, ir);
			ELSE
				c := ObtenerCorreoUsuario(usrConectado);
				ModificarDatosUsuario (c, ObtenerParamComando(1, cmd), ObtenerParamComando(2, cmd), usuarios, ir);	
			END;	
		END;

(***************** ENVIAR MENSAJE *************************)
		IF Equal(cmdName, "enviarMensaje") THEN
			IF AdminUsr THEN
				AsignarCodigoImpresionResultado(USUARIO_NOLOGUEADO, ir);
			ELSE
				c := ObtenerCorreoUsuario(usrConectado);
				Assign(ObtenerParamComando(1, cmd), correoDestino);
				SacarComillas(ObtenerParamComando(2, cmd), asunto);
				SacarComillas(ObtenerParamComando(3, cmd), fecha);
				SacarComillas(ObtenerParamComando(4, cmd), cuerpo);
				
				EnviarMensaje(c, correoDestino, ObtenerParamComando(2, cmd), ObtenerParamComando(3, cmd),
						 ObtenerParamComando(4, cmd), usuarios, ir);
			END;
		END;

(***************** SOLICITUD AMIGO *************************)
		IF Equal(cmdName, "solicitudAmigo") THEN
			IF AdminUsr THEN
			        AsignarCodigoImpresionResultado(USUARIO_NOLOGUEADO, ir);
			ELSE
				c := ObtenerCorreoUsuario(usrConectado);
				Assign(ObtenerParamComando(1, cmd), correoDestino);
								
				SolicitudAmigo(c, correoDestino, ObtenerParamComando(2, cmd), usuarios, ir);	
			END;
		END;

(***************** ACEPTAR SOLICITUD *************************)
		IF Equal(cmdName, "aceptarSolicitudAmigo") THEN
			IF AdminUsr THEN
			        AsignarCodigoImpresionResultado(USUARIO_NOLOGUEADO, ir);
			ELSE
				c := ObtenerCorreoUsuario(usrConectado);
				Assign(ObtenerParamComando(1, cmd), correoDestino);
				AceptarSolicitudAmigo (correoDestino, c, usuarios, ir);
			END;
		END;
(***************** RECHAZAR SOLICITUD *************************)
		IF Equal(cmdName, "rechazarSolicitudAmigo") THEN
			IF AdminUsr THEN
			        AsignarCodigoImpresionResultado(USUARIO_NOLOGUEADO, ir);
			ELSE
				c := ObtenerCorreoUsuario(usrConectado);
				Assign(ObtenerParamComando(1, cmd), correoDestino);
				RechazarSolicitudAmigo(correoDestino, c, usuarios, ir);
			END;
		END;

(***************** BORRAR AMIGO *************************)
		IF Equal(cmdName, "borrarAmigo") THEN
			IF AdminUsr THEN
			        AsignarCodigoImpresionResultado(USUARIO_NOLOGUEADO, ir);
			ELSE
				c := ObtenerCorreoUsuario(usrConectado);
				Assign(ObtenerParamComando(1, cmd), correoDestino);
				BorrarAmigo(c, correoDestino, ObtenerParamComando(2, cmd), usuarios, ir);
			END;
		END;

(***************** BORRAR MENSAJES *************************)
		IF Equal(cmdName, "borrarMensajes") THEN
			IF AdminUsr THEN
			        AsignarCodigoImpresionResultado(USUARIO_NOLOGUEADO, ir);
			ELSE
				cond := ParametroACondicion(ObtenerParamComando(1, cmd));
			        (*cond := CrearCondConString(ObtenerParamComando(1, cmd), ObtenerParamComando(2, cmd), ObtenerParamComando(3, cmd));*)
				c := ObtenerCorreoUsuario(usrConectado);
				
				AsignarCodigoImpresionResultado(NO_CUMPLEN_CONDICION, ir);
				AsignarParamImpresionResultado (1, 'mensajes', ir);
				
				(*Assign(ObtenerParamComando(1, cmd), paramImpr);
				Append(' ', paramImpr);
				Append(ObtenerParamComando(2, cmd), paramImpr);
				Append(' ', paramImpr);
				Append(ObtenerParamComando(3, cmd), paramImpr);*)
				Assign(CondicionAParametro(cond), paramImpr);
				AsignarParamImpresionResultado (2, paramImpr, ir);
				
				BorrarMensajes(cond, c, usuarios, ir);
			END;
		END;

(***************** BUSCAR AMIGOS *************************)
		IF Equal(cmdName, "buscarAmigos") THEN
			IF AdminUsr THEN
			        AsignarCodigoImpresionResultado(USUARIO_NOLOGUEADO, ir);
			ELSE
				cond := ParametroACondicion(ObtenerParamComando(1, cmd));
				(*cond := CrearCondConString(ObtenerParamComando(1, cmd), ObtenerParamComando(2, cmd), ObtenerParamComando(3, cmd));*)
				c := ObtenerCorreoUsuario(usrConectado);
				
				AsignarCodigoImpresionResultado(NO_CUMPLEN_CONDICION, ir);
				AsignarParamImpresionResultado (1, 'usuarios', ir);
				
				(*Assign(ObtenerParamComando(1, cmd), paramImpr);
				Append(' ', paramImpr);
				Append(ObtenerParamComando(2, cmd), paramImpr);
				Append(' ', paramImpr);
				Append(ObtenerParamComando(3, cmd), paramImpr);*)
				
				Assign(CondicionAParametro(cond), paramImpr);
				AsignarParamImpresionResultado (2, paramImpr, ir);
				
				BuscarAmigos(cond, c, usuarios, ir);
			END;
		END;

(***************** SUGERIR AMIGOS *************************)
		IF Equal(cmdName, "sugerirAmigos") THEN
			IF AdminUsr THEN
			        AsignarCodigoImpresionResultado(USUARIO_NOLOGUEADO, ir);
			ELSE
				c := ObtenerCorreoUsuario(usrConectado);
				SugerirAmigos(c, usuarios, ir);	
			END;
		END;

(***************** LISTAR USUARIOS *************************)
		IF Equal(cmdName, "listarUsuarios") THEN
			IF AdminUsr THEN
				(*cond := CrearCondConString(ObtenerParamComando(1, cmd), ObtenerParamComando(2, cmd),
								ObtenerParamComando(3, cmd));*)
				cond := ParametroACondicion(ObtenerParamComando(1, cmd));
			        AsignarCodigoImpresionResultado(NO_CUMPLEN_CONDICION, ir);
				AsignarParamImpresionResultado (1, 'usuarios', ir);
				(*
				Assign(ObtenerParamComando(1, cmd), paramImpr);
				Append(' ', paramImpr);
				Append(ObtenerParamComando(2, cmd), paramImpr);
				Append(' ', paramImpr);
				Append(ObtenerParamComando(3, cmd), paramImpr);
				*)
				Assign(CondicionAParametro(cond), paramImpr);
				AsignarParamImpresionResultado (2, paramImpr, ir);
				
				ListarUsuarios (cond, usuarios, ir);
			ELSE
				AsignarCodigoImpresionResultado(OPERACION_PRIVILEGIADA, ir);
				AsignarParamImpresionResultado(1, cmdName, ir);	
			END;
		END;

(***************** LEER MENSAJES *************************)
		IF Equal(cmdName, "leerMensaje") THEN
			IF AdminUsr THEN
				AsignarCodigoImpresionResultado(USUARIO_NOLOGUEADO, ir);
			ELSE
				c := ObtenerCorreoUsuario(usrConectado);
				Assign(ObtenerParamComando(1, cmd), correoDestino);
				LeerMensaje(c, correoDestino, ObtenerParamComando(3, cmd),
						ObtenerParamComando(2, cmd), usuarios, ir);
			END;
		END;

(***************** LISTAR MENSAJES *************************)
		IF Equal(cmdName, "listarMensajes") THEN
			IF AdminUsr THEN
				AsignarCodigoImpresionResultado(USUARIO_NOLOGUEADO, ir);
			ELSE
				cond := ParametroACondicion(ObtenerParamComando(3, cmd));
			        (*cond := CrearCondConString(ObtenerParamComando(3, cmd), ObtenerParamComando(4, cmd), ObtenerParamComando(5, cmd));*)
				LstOrd := CrearLstOrdenString(ObtenerParamComando(1, cmd), ObtenerParamComando(2, cmd));	
				
				c := ObtenerCorreoUsuario(usrConectado);
				
				AsignarCodigoImpresionResultado(NO_CUMPLEN_CONDICION, ir);
				AsignarParamImpresionResultado (1, 'mensajes', ir);
				
				(*Assign(ObtenerParamComando(3, cmd), paramImpr);
				Append(' ', paramImpr);
				Append(ObtenerParamComando(4, cmd), paramImpr);
				Append(' ', paramImpr);
				Append(ObtenerParamComando(5, cmd), paramImpr);*)
				
				Assign(CondicionAParametro(cond), paramImpr);
				AsignarParamImpresionResultado (2, paramImpr, ir);
				
				ListarMensajes (c, LstOrd, cond, usuarios, ir);
				DestruirLstOrdenMensajes(LstOrd);
			END;
		END;
(******************************************************************************)
(**************************** BEGIN Nuevos Comandos ***************************)
(******************************************************************************)
(***************** ESCRIBIR EN MURO *************************)
		IF Equal(cmdName, "escribirEnMuro") THEN
			IF AdminUsr THEN
				AsignarCodigoImpresionResultado(USUARIO_NOLOGUEADO, ir);
			ELSE
				c := ObtenerCorreoUsuario(usrConectado);
				Assign(ObtenerParamComando(1, cmd), correoDestino);
				SacarComillas(ObtenerParamComando(2, cmd), comentarioMuro);
				EscribirEnMuro(c, correoDestino, comentarioMuro, usuarios, ir);
			END;
		END;
		
(***************** LISTAR MURO *************************)
		IF Equal(cmdName, "listarMuro") THEN
			IF AdminUsr THEN
				AsignarCodigoImpresionResultado(USUARIO_NOLOGUEADO, ir);
			ELSE
				c := ObtenerCorreoUsuario(usrConectado);
				Assign(ObtenerParamComando(1, cmd), correoDestino);
				ListarMuro(c, correoDestino, usuarios, ir);
		      	END;
		END;
		
(***************** PASAR AL HISTORIAL *************************)
		IF Equal(cmdName, "pasarAlHistorial") THEN
			IF AdminUsr THEN
				AsignarCodigoImpresionResultado(USUARIO_NOLOGUEADO, ir);
			ELSE
				c := ObtenerCorreoUsuario(usrConectado);
				StrToCard(ObtenerParamComando(1, cmd), cantidad, res);
				PasarAlHistorial(c, cantidad, usuarios, ir);
		    	END;
		END;
		
(***************** RECUPERAR DEL HISTORIAL *************************)
		IF Equal(cmdName, "recuperarDelHistorial") THEN
			IF AdminUsr THEN
				AsignarCodigoImpresionResultado(USUARIO_NOLOGUEADO, ir);
			ELSE
				c := ObtenerCorreoUsuario(usrConectado);
				StrToCard(ObtenerParamComando(1, cmd), cantidad, res);
				RecuperarDelHistorial(c, cantidad, usuarios, ir);
		    	END;
		END;
		
(***************** LISTAR HISTORIAL *************************)
		IF Equal(cmdName, "listarHistorial") THEN
			IF AdminUsr THEN
				AsignarCodigoImpresionResultado(USUARIO_NOLOGUEADO, ir);
			ELSE
				c := ObtenerCorreoUsuario(usrConectado);
				ListarHistorial(c, usuarios, ir);
		      	END;
		END;

(***************** LISTAR PRIVACIDAD *************************)
		IF Equal(cmdName, "listarPrivacidad") THEN
			IF AdminUsr THEN
				AsignarCodigoImpresionResultado(USUARIO_NOLOGUEADO, ir);
			ELSE
				c := ObtenerCorreoUsuario(usrConectado);
				ListarPrivacidad(c, usuarios, ir);
		      	END;
		END;
		
(***************** MODIFICAR PRIVACIDAD *************************)
		IF Equal(cmdName, "modificarPrivacidad") THEN
			IF AdminUsr THEN
				AsignarCodigoImpresionResultado(USUARIO_NOLOGUEADO, ir);
			ELSE
				c := ObtenerCorreoUsuario(usrConectado);
				ModificarPrivacidad(c, ObtenerParamComando(1, cmd), usuarios, ir);
		      	END;
		END;

(***************** LISTAR AMIGOS *************************)
		IF Equal(cmdName, "listarAmigos") THEN
			IF AdminUsr THEN
				AsignarCodigoImpresionResultado(USUARIO_NOLOGUEADO, ir);
			ELSE
				c := ObtenerCorreoUsuario(usrConectado);
				ListarAmigos(c, usuarios, ir);
		      	END;
		END;

(***************** GRADOS DE SEPARACION *************************)
		IF Equal(cmdName, "gradoSeparacion") THEN
			IF AdminUsr THEN
				AsignarCodigoImpresionResultado(USUARIO_NOLOGUEADO, ir);
			ELSE
				c := ObtenerCorreoUsuario(usrConectado);
				Assign(ObtenerParamComando(1, cmd), correoDestino);
				StrToCard(ObtenerParamComando(2, cmd), cantidad, res);
				GradoSeparacion(c, correoDestino, cantidad, usuarios, ir);
		      	END;
		END;

(***************** LISTAR BARRIO *************************)
		IF Equal(cmdName, "listarBarrio") THEN
			IF AdminUsr THEN
				AsignarCodigoImpresionResultado(USUARIO_NOLOGUEADO, ir);
			ELSE
				c := ObtenerCorreoUsuario(usrConectado);
				ListarBarrio(c, usuarios, ir);
		      	END;
		END;
		
(***************** PERSISTIR *************************)
		IF Equal(cmdName, "persistir") THEN
			IF AdminUsr THEN
				Assign(ObtenerParamComando(1, cmd), fileName);
				IF Save(usuarios, fileName) THEN
					CardToStr(ObtenerCantUsrDicUsuario(usuarios), strCant);
					AsignarCodigoImpresionResultado(ARCHIVO, ir);
					AsignarParamImpresionResultado(1, 'persistio', ir);
					AsignarParamImpresionResultado(2, strCant, ir);
				END;
			ELSE
				AsignarCodigoImpresionResultado(OPERACION_PRIVILEGIADA, ir);
				AsignarParamImpresionResultado(1, cmdName, ir);
			END;
		END;
		
(***************** RECUPERAR *************************)
		IF Equal(cmdName, "recuperar") THEN
			IF AdminUsr THEN
				Assign(ObtenerParamComando(1, cmd), fileName);
				usuarios := Load(fileName);
				
				CardToStr(ObtenerCantUsrDicUsuario(usuarios), strCant);
				AsignarCodigoImpresionResultado(ARCHIVO, ir);
				AsignarParamImpresionResultado(1, 'cargo', ir);
				AsignarParamImpresionResultado(2, strCant, ir);
			ELSE
				AsignarCodigoImpresionResultado(OPERACION_PRIVILEGIADA, ir);
				AsignarParamImpresionResultado(1, cmdName, ir);
			END;
		END;
(******************************************************************************)
(************************** END Nuevos Comandos *******************************)
(******************************************************************************)
		
(***************** SALIR *************************)
		IF Equal(cmdName, "salir") THEN
			IF AdminUsr THEN
				FinPrograma := TRUE;
				AsignarCodigoImpresionResultado(VACIO, ir);
			ELSE
				AsignarCodigoImpresionResultado(OPERACION_PRIVILEGIADA, ir);
				AsignarParamImpresionResultado(1, cmdName, ir);	
			END;
		END;
			
(***************** Imprimo el Resultado de impresion ****************)			
		ImprimirImpresionResultado(ir);
	END;
(***************** Imprimo el Salir y libero memoria****************)			
	AsignarCodigoImpresionResultado(SALIR , ir);
	ImprimirImpresionResultado(ir);
	DestruirComando(cmd);
	DestruirImpresionResultado(ir);	
	DestruirDicUsuario(usuarios);
	
END P2RedSocial.